/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../macro/head.h"
#include "all_impl.h"

namespace xos_package
{
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static all_impl::ITEM_DATA xos_item_data;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    all_impl::all_impl()
    {
        init_data();
    }

    all_impl::~all_impl()
    {
        term();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int all_impl::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int all_impl::init_data()
    {
        int ret = 0;

        m_pCompress = 0;
        m_pPackage = 0;
        m_pDes = 0;

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int all_impl::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            m_pCompress = mgr::container()->compress()->protocol();
        }

        if( 0 == ret )
        {
            m_pDes = mgr::container()->encrypt()->des();
        }

        if( 0 == ret )
        {
            m_pPackage = mgr::get()->package();
        }

        return ret;
    }

    int all_impl::term()
    {
        int ret = 0;

        xos_stl::release_interface( m_pCompress );
        xos_stl::release_interface( m_pPackage );
        xos_stl::release_interface( m_pDes );

        init_data();

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // head md5(2) + body len(2) + body md5(2) + body(n)
    // 
    // 返回值定义：
    //  0  : 成功解到一包数据
    //	1  : 数据不够一包
    // -1  : 是非法的数据包，应该断掉连接
    // -2  : 解包出错，数据包不正确，应该断掉连接
    // 
    int all_impl::un_pack( xos_box::i_list * pOutputList, xos_box::i_list * pInputList )
    {
        int ret = 0;

        xos_box::i_list * pEncodeList = 0;
        xos_box::i_list * pDataList = 0;

        if( 0 == ret )
        {
            pEncodeList = mgr::container()->box()->list();
            pDataList = mgr::container()->box()->list();
        }

        if( 0 == ret )
        {
            ret = m_pPackage->un_pack( pDataList, pInputList );
        }

        if( 0 == ret )
        {
            ret = m_pCompress->un_compress( pEncodeList, pDataList );
        }

        if( 0 == ret )
        {
            ret = m_pDes->encode( pOutputList, pEncodeList );
        }

        xos_stl::release_interface( pEncodeList );
        xos_stl::release_interface( pDataList );

        return ret;
    }

    // 
    // head md5(2) + body len(2) + body md5(2) + body(n)
    // 
    // 返回值定义
    // 
    // 0  : 成功
    // -1 : 失败，有包数据太长( len <= xos_box::i_buf::BUF_SIZE - 6 )
    // 
    int all_impl::pack( xos_box::i_list * pOutputList, xos_box::i_list * pInputList, xos_compress::enumObjType eType )
    {
        int ret = 0;

        xos_box::i_list * pCompressList = 0;
        xos_box::i_list * pEncodeList = 0;

        if( 0 == ret )
        {
            pCompressList = mgr::container()->box()->list();
            pEncodeList = mgr::container()->box()->list();
        }

        if( 0 == ret )
        {
            ret = m_pDes->encode( pEncodeList, pInputList );
        }

        if( 0 == ret )
        {
            ret = m_pCompress->compress( pCompressList, pEncodeList, eType );
        }

        if( 0 == ret )
        {
            ret = m_pPackage->pack( pOutputList, pCompressList );
        }

        xos_stl::release_interface( pCompressList );
        xos_stl::release_interface( pEncodeList );

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // 3Des密码
    // 
    int all_impl::set_3des_key( const char * lpszKey, int nKeyLen )
    {
        int ret = 0;

        if( 0 == ret )
        {
            m_pDes->set_3des_key( lpszKey, nKeyLen );
        }

        return ret;
    }

    // 
    // 干扰key,用来混入md5计算，让试图破解的人无从判断包头的计算规则
    // 
    int all_impl::set_md5_key( const char * lpszKey )
    {
        int ret = 0;

        if( 0 == ret )
        {
            m_pPackage->set_md5_key( lpszKey );
        }

        return ret;
    }

} // xos_package
